//记录linux的各种骚操作代码

#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; \
})
/*
*其中第四行代码是为了在用户传入不同类型的变量进行比较时给出警告，前面的(void)又是为了让编译器忽略后面代码的结果
*个人理解上面的宏{}里面的内容相当于一个函数，在函数内部完成一系列操作后，通过()得到返回值
*例：
#define ret_sub(x) ({\
    typeof(tmp) = 5;\
    x - tmp;\
})
*/

int tmp_array[] = {[1 ... 3] = 5,[4 ... 6] = 7};
/*
*上面代码的意思是将数组1到3的元素初始化为5，4到6的元素初始化为7，注意中间的空格不能少
*/

int n;
switch(n)
{
    /*写法1*/
    case 1 ... 3:
    break;
    /*写法2*/
    case 1:
    case 2:
    case 3:
    break;
}
/*
*上面两种写法都可以将1到3的分支归为一种情况
*/

int sem_timedwait_ms(sem_t *sem, time_t msec)
{
    struct timespec ts;
    time_t nsec;
    int ret;

    nsec = msec * 1000 * 1000;
    ret = 0;
    do {
        clock_gettime(CLOCK_REALTIME, &ts);
        ts.tv_nsec += nsec;
        ts.tv_sec += ts.tv_nsec / 1000000000;
        ts.tv_nsec %= 1000000000;
        if(sem_timedwait(sem, &ts) < 0)
        {
            if((errno == EINTR) || (errno == EAGAIN))
            {
                continue;
            }
            else if(errno == ETIMEDOUT)
            {
                ret = 1;
            }
            else
            {
                ret = -1;
            }
        }
        break;
    }while(1);

    return ret;
}

int sem_timedwait_s(sem_t *sem, time_t sec)
{
    struct timespec ts;
    int ret;

    ret = 0;
    do {
        clock_gettime(CLOCK_REALTIME, &ts);
        ts.tv_sec += sec;
        if(sem_timedwait(sem, &ts) < 0)
        {
            if((errno == EINTR) || (errno == EAGAIN))
            {
                continue;
            }
            else if(errno == ETIMEDOUT)
            {
                ret = 1;
            }
            else
            {
                ret = -1;
            }
        }
        break;
    }while(1);

    return ret;
}
